import CryptoJS from 'crypto-js'

// 定义固定密钥和初始化向量
const sec = CryptoJS.enc.Utf8.parse('ydcc50kgxf75849b')
const iv = CryptoJS.enc.Utf8.parse('0102020303040506')

/**
 * AES加密函数
 * @param {string|Object} code - 需要加密的内容，可以是字符串或对象（自动转为JSON）
 * @param {string} [secretKey=''] - 可选加密密钥，默认使用内置密钥
 * @returns {string} 返回加密后的十六进制字符串
 */
export const encrypt = (code, secretKey = '') => {
  // 处理密钥：优先使用传入密钥，否则使用默认密钥
  const _secretKey = !!secretKey && CryptoJS.enc.Utf8.parse(secretKey) || sec
  
  // 统一输入格式：非字符串类型转换为JSON字符串
  const _code = typeof code === 'string' ? code : JSON.stringify(code)
  
  // 执行AES-CBC加密（PKCS7填充）
  const result = CryptoJS.AES.encrypt(
    CryptoJS.enc.Utf8.parse(_code),
    _secretKey,
    { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
  )
  
  return result.ciphertext.toString()
}

/**
 * AES解密函数
 * @param {string} code - 加密后的十六进制字符串
 * @returns {string} 返回解密后的原始字符串
 */
export const decrypt = code => {
  // 转换十六进制字符串为加密数据格式
  const encryptedHexStr = CryptoJS.enc.Hex.parse(code)
  
  // 将加密数据转换为Base64格式
  const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr)
  
  // 执行AES-CBC解密（使用固定密钥和IV）
  const ret = CryptoJS.AES.decrypt(
    srcs,
    sec,
    { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
  )
  
  // 将解密结果转为UTF-8字符串
  const decryptedStr = ret.toString(CryptoJS.enc.Utf8)
  return decryptedStr.toString()
}